|

MP3 Ses Sıkıştırma
SIKIŞTIRMA YÖNTEMLERİ
Veri sıkıştırma, Sayısal Haberleşmenin önemli konularındandır. Veri sıkıştırma yöntemleri temel olarak iki grupta toplanırlar. İlk grupta LZW, Huffman gibi "Kayıpsız" sıkıştırma algoritmaları bulunur. Bu tür sıkıştırma algoritmalarında verinin hiç fazlalık bilgi içermediği, ancak verinin verimli kodlanmadığı varsayılır. Bir örnek vermek gerekirse, elimizde 100 110 100 110 111 100 gibi bir dizi olsun. Huffman yöntemine göre şöyle bir kodlama yapılabilir:=100->0;110->10;111->1. Böylece kodlanmış verimiz şu hale gelir: 0 10 0 10 11 0. Gördüğünüz gibi 18 bitlik veri 9 bite sıkıştırıldı.Zip, Arj gibi sıkıştırıcılar buna benzer yöntemler kullanır. İkinci grup ise "Kayıplı" sıkıştırma algoritmaları. Bu algoritmalarda ise sıkıştırılacak verinin fazlalık bilgi içerdiği kabul edilir. MP3, JPEG, MPEG gibi algoritmalar da bu sınıfa girerler.
FAZLALIK BİLGİ; NE KADARI FAZLA?
Gelin önce fazlalık bilginin ne olduğunu anlamaya çalışalım. Bir işaretin (verinin) taşıdığı bilgi miktarı, işaretin gelecekteki değerlerinin geçmiş değerleri yardımıyla ne kadar tahmin edilebildiğini gösterir. (Biliyorum, biraz karışık ama ne yapayım, bu işler böyle..) Mesela işaretimiz A*sin(wt) olsun. İşareti belli bir süre gözlemledikten sonra A ve w değerlerini belirleyebiliriz. A ve w bulunduktan sonra artık her hangi bir anda işaretin değeri hesaplanabilir. Yani artık bu işaret bizim için bilgi taşımayan bir işaret olmuştur. Fazlalık bilgi için bir tanım daha var. Algısal işaretlerde (resim, ses) insan algısının dışında kalan tüm bilgiler fazlalıktır. Bu makalenin konusu ses sıkıştırma olduğuna göre, buradan sonra ses işareti üzerinde yoğunlaşalım. İnsanlar sesleri kulak denen ve genelde insanlarda iki adet bulunan duyu organları ile algılarlar... :)
KULAK VE DUYMA
İnsan kulağı, aslında kötü bir alıcıdır. 20 Hz den düşük, 22050 Hz. den büyük frekanslı sesleri duyamayız. (CD lerin örnekleme frekansı 22050*2=44100 Hz. dir. Sizce tesadüf mü??) Ayrıca çok zayıf sesler de kulak tarafından algılanamaz. Bir önceki paragrafta işaretlerin algılanamayan kısmına fazlalık bilgi demiştik. Öyleyse ilk adımımız belli. Duyamayacağımız frekansları eleyelim. MP3 tekniğinde aslında 60 Hz. altındaki işaretler yok edilir. Çünkü bu seviyenin altındaki seslerin duyulması için epey güçlü olmaları gereklidir. Aynı şekilde 16500 Hz. üzerindeki sesler de süzülür, burada da duyulabilir seslerin ciddi güçler taşıması gerekli. Eh, duyamayacağımız frekanslardan kurtulduk. Yetti mi? Hayır. Daha en önemli şeyi söylemedim bile. Maskeleme etkisi.
MASKELEME
Maskeleme etkisi, kulağın fiziksel kısıtlamalarından kaynaklanır. Maskelemenin tanımı, bir sesin başka bir ses tarafından duyulmasının engellenmesi, yani bastırılmasıdır. Birbirine yakın frekanslı iki ses olsun. Örneğin birinci sesin frekansı 440 Hz, ikinci sesin frekansı 450 Hz. Eğer düşük frekanslı ses yüksek frekanslı sesten biraz daha güçlüyse, ikinci ses tarafımızdan duyulmayacaktır. İşte bir fazlalık bilgi daha. ''Duyamıyorsan, yok et!'' kuralı işler, ses işaretinin taşıdığı bilgi değişmeden işeretin boyutu değişir...mi? Hayır, eğer zaman ekseninde çalışıyorsanız değişmez. Ama frekans ekseninde evet, işaretin kapladığı alan azalır. İşin bundan sonraki kısmı biraz matematik ve elektronik bilgisi gerektiriyor. Onun için olayları biraz basitleştirip anlatmak gerekli. Herkesin anlayabileceği boyuta indirgemeye çalışacağım.Bundan sonraki kısım biraz daha zor anlaşılır.
FREKANS EKSENİ
Charles Marié Fouriér isimli bir Fransız matematikçi, tüm işaretlerin bir dizi sinüsün toplamı olarak ifade edilebildiğini keşfetti. Bu sinüslerin frekansları, genlikleri ve fazları matematiksel yollarla hesaplanabilirdi. Bu yönteme Fourier Dönüşümü adı verilir. Fourier Dönüşümü yardımıyla bir işaretin hangi frekans aralığında ne kadar güç taşıdığı, başka bir deyişle frekans spektrumu bulunabilir. Ancak bu yöntemin bir dezavantajı var, işaret ne kadar uzunsa, Fourier Dönüşümü de o kadar uzundur. Yine de bazı durumlarda yalnızca Fourier Dönüşümü almak bile müthiş sıkıştırma oranları elde etmek mümkün.
Örneğin elimizde 10 saniye süreli, 44100 Hz de örneklenmiş 1 Khz lik bir sinüs olsun. Zaman ekseninde bu işaretin görüntüsü şekil 1 deki gibidir. Frekans ekseninde ise şekil 2 deki gibi. Şekil 1 de toplam 44100*10 adet nokta var. Şekil 2 de ise 2 noktanın değerini bilmemiz işareti tekrar elde etmek için yeterli. Aslında iki noktayı bire indirgemek de mümkün. Bu iş içinse Ayrık Kosinüs Dönüşümü (Discrete Cosine Transform -DCT) kullanılır. (Not: Resimeki işaret windows "ding" sesinden alınmış bir parçadır. Bu tam olarak bir sinüs olmasa da konunun anlaşılması için kullanılabilir.)
Şekil1
Şekil2
Fourier Dönüşümü ya da DCT ile işaretin ilerleyen zaman boyunca nasıl değiştiğini görmek mümkün değildir. Oysa ses işareti zamanla değişir. Üstelik bu değişimi tahmin etmek için bir kural bulmak da neredeyse olanaksızdır. Peki, zamanla değişen işaretin frekans ekseninde nasıl davrandığını anlamanın bir yolu yok mu? Elbette var, işareti küçük parçalara bölüp her parçanın Fourier Dönüşümünü alırsak, işaretin zaman ilerledikçe frekans ekseninde nasıl değiştiğini görebiliriz. Bu işleme çerçevelere bölme (framing) denir. İşareti çerçevelere bölüp Fourier Dönüşümünü hesaplama işine de Kısa Süreli Fourier Dönüşümü (Short Time Fourier Transform - STFT) denir.
ÇERÇEVELEME
İşareti çerçevelere ayırırken uyulması gereken bazı kurallar vardır. İlk yapılacak iş çerçeve uzunluğunu hesaplamak. Çerçevemiz hem gerekli frekans çözünürlüğüne sahip olmalı, hem de işaretin özelliklerinin sabit kalacağı uzunlukta olmalı. İlk şartımız çerçevenin uzunluğunu arttırmamızı, ikinci şart ise kısaltmamızı söylüyor. MP3 için orta yol olarak 385 baytlık çerçeveler öngörülmüş.
İkinci olarak pencere tipini seçmemiz gerekli. Bir işareti bir pencere fonksiyonu ile çarptığınızda, yani çerçevelere ayırdığımızda işaretin frekans spektrumu bozulur. Bu bozulmayı en aza indirgemek için özel pencereleme fonksiyonları kullanılır. En sık kullanılan pencereler Hanning ve Blackman pencereleridir (Şekil 3).



YAĞ,ŞEKER,UN
Evet, şimdi yağımız, şekerimiz ve unumuz hazır. Helvayı pişirmeye başlayabiliriz. Yapılması gerekenleri maddeler halinde şu şekilde sıralayabiliriz:
1. Wav dosyayı oku.
2. Okunan işareti pencere fonksiyonu ile çarparak çerçevelere ayır.
3. İlk çerçevenin DCT'sini hesapla. Burada DCT, tek tek her bileşenin belirlenmesi için kullanılmaz. MP3'te tek tek bileşenlerle uğraşmak yerine tüm frekans ekseni 32 parçaya ayrılır ve her parçada taşınan güce bakılır. MP1 ve MP2'de frekans bantları eşit olarak ayrılırken MP3'te alt frekanslar eşit genişlikli değildir. İnsan kulağının daha duyarlı olduğu bölgelerde bant genişlikleri daha dar tutulur.
4. Her alt bant için maskeleme eşiklerini hesapla. Diğer bantlar tarafından duyulması engellenen (maskelenen) bantları at. MP1 ve MP2'de yalnızca komşu frekans bantlarının birbirlerini maskeleyebildiği varsayılırken, MP3'te her bandın diğer tüm bantlara göre durumuna bakılır.
5. Şimdi artık elimizde fazlalık bilgi içermeyen bir veri dizisi var. Ama bu veri dizisi bir bakıma halen fazlalık bilgi taşımaktadır. Sondan bir önceki bu adımda, DCT'si alınmış ve maskeleme kuralları uygulanmış dizi son olarak kayıpsız kodlamaya tabi tutulur. Bu iş için hazır Standart Huffman kod tabloları vardır. Elimizdeki işareti bu tabloya göre kodlarız.
6. İşte son adım. MP3 dosya yapısına uygun olarak elde edilen veriyi diske yaz ve diğer çerçeveler için de 3. adım ve sonrasını tekrarla.
KOD MU İSTİYORSUNUZ?
Açık kodlu MP3 kodlayıcı ve kod çözücüleri internet üzerinde bulmak mümkün. Bunlardan şimdilik LAME (LAME Ain't an Mp3 Encoder - http://www.sulaco.org/mp3) ve MP3 konusunda devrim yapacağı iddiası ile çıkan Ogg/Vorbis'i (http://www.ogg.org/ogg/vorbis/index.html) ilginize sunuyoruz.
|